package Thread;

public class Demo13 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            //先获取到线程的引用
            Thread currentThread = Thread.currentThread();
            //currentThread()是Thread类的静态方法,就能获取到调用这个方法的线程的实例
            //哪个线程调用,返回的引用就指向哪个线程的实例(类似于this)
            while(!currentThread.isInterrupted()){//这个
                System.out.println("hello Thread");
                /*
                由于判定isInterrupted()和执行打印操作太快了,因此整个循环,主要的时间都是花在sleep(1000)上
                main调用Interrupt的时候大概率t线程正处于sleep状态中,此处Interrupt不仅仅能设置标志位,还能把刚才这个sleep操作给唤醒
                比如sleep刚睡了100ms,还剩900ms,此时Interrupt被调用了,此时sleep就会直接被唤醒,并且抛出InterruptException异常
                由于catch中默认代码再次抛出异常,再次抛出的异常没人catch,最终就到了JVM这一层,进程就直接异常终止了
                 */
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("执行到catch语句");
                    //这里给了程序员更多的操作空间,可以自行选择是否直接结束或者其他操作
                    break;
                    /*
                    这里加上打印语句,此时程序虽然调用Interrupt把sleep唤醒了,触发异常,被catch了
                    虽然catch了,但是循环还是在继续执行
                    原因:当sleep等阻塞的函数被唤醒之后,就会清空刚才设置的interrupt标志位
                    如果此时想要结束循环,结束线程,就需要再在catch中加上return/break
                     */
                    //throw new RuntimeException(e);
                }
            }
        });
        t.start();
        Thread.sleep(3000);
        //在主线程中,控制t线程被终止,设置上述标志位
        t.interrupt();
    }
}
